package com.yuanhang.readsms;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.telephony.SmsMessage;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.lxj.xpopup.XPopup;
import com.yuanhang.readsms.base.BaseRVAdapter;
import com.yuanhang.readsms.base.BaseRVHolder;
import com.yuanhang.readsms.bean.Sms;
import com.yuanhang.readsms.bean.SmsItem;
import com.yuanhang.readsms.databinding.ActivityMainBinding;
import com.yuanhang.readsms.service.ForegroundService;
import com.yuanhang.readsms.utils.TimeUtils;

import org.litepal.LitePal;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;
    private final int PERMISSION_REQUEST_CODE = 201;
    private final int CODE_PN = 202;
    public static Handler handler;
    private BaseRVAdapter<Sms> adapter;
    private NotificationCompat.Builder builder;
    private NotificationManagerCompat manager;
    private String CHANNEL_ID;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        //创建数据库并生成自建表
        LitePal.getDatabase();

        initView();
        initData();
        initHandler();
    }

    private void initView() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) {
                // 向用户请求权限
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.READ_SMS, Manifest.permission.RECEIVE_SMS},
                        PERMISSION_REQUEST_CODE);
            }
        }

        //android 13及以上系统动态获取通知权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            checkPostNotificationPermission();
        }

        Intent intent = new Intent(this, ForegroundService.class);
        // Android 8.0使用startForegroundService在前台启动新服务
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundService(intent);
        } else {
            startService(intent);
        }

        // 创建通知频道，如果用户没有创建，则会自动创建。
        CHANNEL_ID = "message";
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            if (getSystemService(NotificationManager.class).getNotificationChannel(CHANNEL_ID) == null) {
                NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "消息", NotificationManager.IMPORTANCE_DEFAULT);
                //通知的振动模式。
                channel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
                //为通知通道启用振动。
                channel.enableVibration(true);
                //设置通道的颜色。
                channel.setLightColor(Color.RED);
                //设置通道的锁屏可见性。
                channel.setLockscreenVisibility(NotificationCompat.VISIBILITY_PUBLIC);
                getSystemService(NotificationManager.class).createNotificationChannel(channel);
            }
        }
    }

    private void initData() {
        binding.cvNumSet.setOnClickListener(view -> {
            //跳转到号码管理页面
            startActivity(new Intent(MainActivity.this, NumberManagementActivity.class));
        });

        //查询所有短信
        List<Sms> allSms = LitePal.order("updateTime desc").find(Sms.class);

        adapter = new BaseRVAdapter<Sms>(R.layout.item_sms) {
            @Override
            public void onBindVH(BaseRVHolder holder, Sms data, int position) {
                TextView tvDelete = holder.getView(R.id.tvDelete);
                LinearLayout llContent = holder.getView(R.id.llContent);

                holder.setText(R.id.tvNumber, data.getPhoneNum());

                Type listType = new TypeToken<List<SmsItem>>() {
                }.getType();
                List<SmsItem> smsItemList = new Gson().fromJson(data.getSmsList(), listType);
                holder.setText(R.id.tvContent, smsItemList.get(smsItemList.size() - 1).getContent());
                holder.setText(R.id.tvAddTime, smsItemList.get(smsItemList.size() - 1).getAddTime());

                tvDelete.setOnClickListener(view -> {
                    //删除操作
                    new XPopup.Builder(MainActivity.this).asConfirm("提示",
                                    "确定删除该数据吗",
                                    () -> {
                                        LitePal.delete(Sms.class, data.getId());
                                        adapter.remove(position);
                                    })
                            .show();
                });

                //查看短信详情
                llContent.setOnClickListener(view -> {
                    Intent intent = new Intent(MainActivity.this, SmsDetailsActivity.class);
                    intent.putExtra("phoneNumber", data.getPhoneNum());
                    intent.putExtra("smsList", data.getSmsList());
                    startActivity(intent);
                });
            }
        };
        binding.rvSms.setLayoutManager(new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL));
        binding.rvSms.setAdapter(adapter);
        adapter.setNewData(allSms);
    }

    private void initHandler() {
        handler = new Handler(getMainLooper()) {
            @SuppressLint("SetTextI18n")
            @Override
            public void handleMessage(@NonNull Message msg) {
                super.handleMessage(msg);
                if (msg.what == 200 && msg.arg1 == 0) {
                    SmsMessage smsMessage = (SmsMessage) msg.obj;

                    //通知显示消息
                    showNotification(getString(R.string.app_name), smsMessage.getMessageBody());

                    List<Sms> allSms = LitePal.findAll(Sms.class);
                    if (!allSms.isEmpty()) {
                        for (int i = 0; i < allSms.size(); i++) {
                            if (allSms.get(i).getPhoneNum().equals(smsMessage.getOriginatingAddress())) {
                                //列表中的手机号与收到的短信的手机号相同则更新数据
                                SmsItem smsItem = new SmsItem();
                                smsItem.setContent(smsMessage.getMessageBody());
                                smsItem.setAddTime(TimeUtils.dateToString(TimeUtils.getTimeStame()));

                                Type listType = new TypeToken<List<SmsItem>>() {
                                }.getType();
                                List<SmsItem> smsItemList = new Gson().fromJson(LitePal.findAll(Sms.class).get(i).getSmsList(), listType);
                                smsItemList.add(smsItem);

                                Sms sms = new Sms();
                                sms.setPhoneNum(smsMessage.getOriginatingAddress());
                                sms.setSmsList(new Gson().toJson(smsItemList));
                                sms.setUpdateTime(TimeUtils.dateToString(TimeUtils.getTimeStame()));
                                sms.update(allSms.get(i).getId());

                                //更新列表
                                adapter.setNewData(LitePal.order("updateTime desc").find(Sms.class));
                            } else {
                                //不相同则插入新数据
                                SmsItem smsItem = new SmsItem();
                                smsItem.setContent(smsMessage.getMessageBody());
                                smsItem.setAddTime(TimeUtils.dateToString(TimeUtils.getTimeStame()));

                                List<SmsItem> smsItemList = new ArrayList<>();
                                smsItemList.add(smsItem);

                                Sms sms = new Sms();
                                sms.setPhoneNum(smsMessage.getOriginatingAddress());
                                sms.setSmsList(new Gson().toJson(smsItemList));
                                sms.setUpdateTime(TimeUtils.dateToString(TimeUtils.getTimeStame()));
                                sms.save();

                                //更新列表
                                adapter.setNewData(LitePal.order("updateTime desc").find(Sms.class));
                            }
                        }
                    } else {
                        //第一次无数据直接保存
                        SmsItem smsItem = new SmsItem();
                        smsItem.setContent(smsMessage.getMessageBody());
                        smsItem.setAddTime(TimeUtils.dateToString(TimeUtils.getTimeStame()));

                        List<SmsItem> smsItemList = new ArrayList<>();
                        smsItemList.add(smsItem);

                        Sms sms = new Sms();
                        sms.setPhoneNum(smsMessage.getOriginatingAddress());
                        sms.setSmsList(new Gson().toJson(smsItemList));
                        sms.setUpdateTime(TimeUtils.dateToString(TimeUtils.getTimeStame()));
                        sms.save();

                        //更新列表
                        adapter.setNewData(LitePal.order("updateTime desc").find(Sms.class));
                    }
                }
            }
        };
    }

    private void checkPostNotificationPermission() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_NOTIFICATION_POLICY)
                != PackageManager.PERMISSION_GRANTED) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_NOTIFICATION_POLICY}, CODE_PN);
            }
        } else if (manager != null) {
            //通知ID设置(您可以使用任何您想要的ID，相同ID通知只会显示一个)。
            manager.notify(2, builder.build());
        }
    }

    private void showNotification(String title, String content) {
        //设置服务跳转
        Intent intent = new Intent(this, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 2, intent,
                PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);

        // 创建并分发通知。
        builder = new NotificationCompat.Builder(this, CHANNEL_ID)
                // 设置通知的小图标。
                .setSmallIcon(R.mipmap.ic_launcher)
                //设置通知的标题。
                .setContentTitle(title)
                //设置通知的内容
                .setContentText(content)
                //设置通知的优先级。
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                //震动模式的通知在Android O及以上。
                .setVibrate(new long[]{0, 1000, 500, 1000})
                //在Android O及以上的系统上使用LED光色和微信号。
                .setLights(Color.RED, 1000, 1000)
                //设置Android O及以上版本的通知声音。
                .setSound(Uri.parse("android.resource://" + this.getPackageName() + "/raw/notification_sound"))
                //如果需要，在Android O及以上版本设置较大的通知标题。
                // .setLargeTitle("Large Title Text")
                //如果需要，在Android O及以上版本设置通知的子文本。
                // .setSubText("Sub Text")
                //如果需要，在Android O及以上版本设置大字体通知。
                // .setStyle(new NotificationCompat.BigTextStyle().bigText("Big Text"))
                //如果需要，在Android O及以上版本设置通知摘要文本(当有多个具有相同优先级的通知时显示摘要文本)。
                // .setSummaryText("Summary Text")
                //如果需要，在通知中添加动作按钮(可用于启动活动或发送广播)。
                // .addAction(R.drawable.ic_action, "Action Title", PendingIntent)
                //设置可点击跳转
                .setContentIntent(pendingIntent)
                //开启点按通知后自动移除通知
                .setAutoCancel(true);
        manager = NotificationManagerCompat.from(this);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            checkPostNotificationPermission();
        } else {
            // 在 Android 10 或更早版本中，不需要请求此权限。
            //ID要和前台服务ID区分开，相同ID只能显示一条通知。
            manager.notify(2, builder.build());
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限被用户同意，可以进行读取短信的操作
                Toast.makeText(this, "短信读取权限授予成功", Toast.LENGTH_SHORT).show();
            } else {
                // 权限被用户拒绝，需要应对没有权限的情况
                Toast.makeText(this, "短信读取权限被拒绝", Toast.LENGTH_SHORT).show();
            }
        } else if (requestCode == CODE_PN) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //允许了通知权限
                Toast.makeText(this, "通知权限授予成功", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "您拒绝了通知权限", Toast.LENGTH_SHORT).show();
            }
        }
    }
}